﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_InstrumentosMusicales
    {
        private IInstrumentoMusical adminInstrumento = null;
        int codigoGenerado = 0;
        MarcaInstrumento objMarcaInstrumento;
        ModeloInstrumento objModeloInstrumento;
        TipoInstrumento objTipoInstrumento;
         
        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            MarcaInstrumentoDAO daoMarcaInstrumento;
            ModeloInstrumentoDAO daoModeloInstrumento;
            TipoInstrumentoDAO daoTipoInstrumento;

            adminInstrumento = new InstrumentosMusicalesDAO();

            daoMarcaInstrumento = new MarcaInstrumentoDAO();
            daoModeloInstrumento = new ModeloInstrumentoDAO();
            daoTipoInstrumento = new TipoInstrumentoDAO();

            //foreach (Reservacion reserva in adminReservacion.ListarTodos())
            //    adminReservacion.Eliminar(reserva);
            // 4. Creamos 2 reservas para tenerlos disponibles en las pruebas
            //adminReservacion.Crear(new Reservacion() { CodigoSala =1, CodigoCliente =1, FechaReservacion = DateTime.Now, TotalHoras = 20, Observacion="Reserva para el sabado a las 3pm.", Estado=true });

            objMarcaInstrumento = daoMarcaInstrumento.Obtener(1);
            objModeloInstrumento = daoModeloInstrumento.Obtener(1);
            objTipoInstrumento = daoTipoInstrumento.Obtener(1);

        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminInstrumento);
            //se instancia a la entidad a crear

            InstrumentosMusicales objInstrumento = new InstrumentosMusicales();
            objInstrumento.NombreInstrumento = "Bateria";
            objInstrumento.AnnoFabricacion = "2010";
            objInstrumento.Caracteristicas = "es nuevo";
            //objInstrumento.CodigoMarca = 1;
            //objInstrumento.CodigoModelo = 1;
            //objInstrumento.CodigoTipoInstrumento = 1;
            objInstrumento.MarcaInstrumento = objMarcaInstrumento;
            objInstrumento.ModeloInstrumento = objModeloInstrumento;
            objInstrumento.TipoInstrumento = objTipoInstrumento;
            objInstrumento.CostoAlquiler = 2.50M;
            objInstrumento.Estado = true;
            
            //se declara la entidad que se retornara
            InstrumentosMusicales adicionalRetornado = null;
            //no aseguramos que no retorne una exepcion
            Assert.DoesNotThrow(delegate
            {
                adicionalRetornado = adminInstrumento.Crear(objInstrumento);
                codigoGenerado = adicionalRetornado.CodigoInstrumento;
            },"Instrumento Adicional Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(adicionalRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }

        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminInstrumento);
            // 2. Declaramos e instanciamos la entidad de dominio
            InstrumentosMusicales objInstrumento = adminInstrumento.Obtener(codigoGenerado);
            objInstrumento.NombreInstrumento = "Bateria";
            objInstrumento.AnnoFabricacion = "2010";
            objInstrumento.Caracteristicas = "es nuevo";
            //objInstrumento.CodigoMarca = 1;
            //objInstrumento.CodigoModelo = 1;
            //objInstrumento.CodigoTipoInstrumento = 1;
            objInstrumento.MarcaInstrumento = objMarcaInstrumento;
            objInstrumento.ModeloInstrumento = objModeloInstrumento;
            objInstrumento.TipoInstrumento = objTipoInstrumento;
            objInstrumento.CostoAlquiler = 2.50M;
            objInstrumento.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            InstrumentosMusicales instrumentoModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                instrumentoModificado = adminInstrumento.Modificar(objInstrumento);
            }, "reserva modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(instrumentoModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(instrumentoModificado.CodigoInstrumento, codigoGenerado);
            // Probamos que la observacion registrado es igual al solicitado con la entidad
            Assert.AreEqual(instrumentoModificado.NombreInstrumento, instrumentoModificado.NombreInstrumento);
        }


        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: ReservacionDAO
            Assert.IsNotNull(adminInstrumento);
            // 2. Definimos la entidad que contendrá el resultado
            InstrumentosMusicales instrumentoExistente = adminInstrumento.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminInstrumento.Eliminar(instrumentoExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminInstrumento.Obtener(codigoGenerado));
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
